昨天學了 jq filter 利用陣列索引取得陣列中的元素,今天來看看多個 filter 如何組合使用。
師傅:徒弟,有聽過 pipe嗎?
徒弟:pipe?是不是像水管一樣的東西?
師傅:差不多。在 jq 裡,pipe 就是 |
符號。它能把左邊的輸出餵給右邊。
徒弟:哦...那實際上怎麼用呢?
師傅:看好了。jq ".[] | .title" todos.json
徒弟:這...這是在做什麼?
師傅:.[]
先把陣列拆開,然後 pipe 把每個元素傳給 .title
。懂了嗎?
徒弟:我想我明白了。那如果我想找特定的資料呢?
師傅:用 select。試試這個:jq ".[] | select(.completed == true) | .title" todos.json
徒弟:哇!這是在找所有完成的 TODO 的標題嗎?
師傅:沒錯。select 就像個篩子,只讓符合條件的過去。
徒弟:太酷了!我可以試試找未完成的 TODO 嗎?
師傅:去吧,小子。讓我看看你學到了什麼。
徒弟:好,我試試...jq ".[] | select(.completed == false) | .title" todos.json
師傅:不錯嘛。看來你開始掌握竅門了。
|
運算子昨天有練習過,將 TODO 陣列所有元素的 Title 屬性值回傳的指令是:
jq ".[].title" todos.json
這個做法等同於
jq ".[] | .title" todos.json`
兩種做法結果雖然一致,但寫法有一點差異;那就是第二種指令使用了 |
。如果第一眼沒看出差別的話,可以多瞄幾眼。
|
pipe 運算子組合了兩個 filter,第一個是 .[]
列出陣列中所有元素,第二個是 .title
取出物件 title 屬性的值。其中 pipe 組合的方式就是把第一個 filter 的輸出值,作為第二個 filter 的輸入值。
仔細想想,原本這個 filter 要處理的資料,是有 200 個元素的一個陣列,而最後輸出結果時,成了 200 個字串。數量從 1 變成 200 ,主要是第一個 filter .[]
列出所有元素的動作時,輸出結果就有兩百個物件元素;從物件到取得 title 屬性值,就是第二個 filter .title
Object Identifier-Index (物件屬性識別索引) 的作用。
No. | filter | input | output |
---|---|---|---|
1 | .[] |
[{}x200] |
{}x200 |
2 | .title |
{}x200 |
"$title"x200 |
看起來,只要我們想要組合多個 filter , |
pipe 就可以派上用場~
select(boolean_expression)
是 jq filter 很常見的過濾資料函式。如果括弧內的 boolean_expression 為 true ,則函式會輸出其輸入的值;否則就不輸出。
jq ".[] | select(.completed == true) | .title" todos.json
jq ".[] | select(.completed == false) | .title" todos.json
今天學到用 |
組合多個 filter,並認識了有用的過濾函式 select()
,感覺自己越來越厲害了!👍😁感謝自己持續的努力。👓✨